package cl.loso.melon.server.persistencia;

import java.util.Date;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import javax.jdo.Transaction;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import cl.loso.melon.server.gae.PMF;
import cl.loso.melon.server.model.UsuarioLVS;
import cl.loso.melon.server.model.VisitaItemLVS;
import cl.loso.melon.server.model.VisitaLVS;
import cl.loso.melon.server.negocio.Seguridad;
import cl.loso.melon.server.util.Util;

public class VisitaLVSDAO {
	private static Log log = LogFactory.getLog(VisitaLVSDAO.class);

	@SuppressWarnings("unchecked")
	public static List<VisitaLVS> obtener(String idUsuario) {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		UsuarioLVS usuario = null;
		List<VisitaLVS> detached = null;
		Query query=null;
		try {
			usuario = pm.getObjectById(UsuarioLVS.class, Long
					.valueOf(idUsuario));
	    	query = pm.newQuery(VisitaLVS.class);
	    	query.setFilter("usuario == pusuario");
	    	query.setOrdering("fecha DESC");//DESC
	    	query.declareParameters("UsuarioLVS pusuario");
	    	detached = (List<VisitaLVS>)pm.detachCopyAll((List<VisitaLVS>)query.execute(usuario));
		} catch (Exception e) {
			log.error("DAO " + e.getMessage());
		} finally {
			pm.close();
		}
		return detached;

	}
	
	@SuppressWarnings("unchecked")
	public static List<VisitaLVS> obtenerVisitasUsuario(Date fecha_ini,
			Date fecha_ter, UsuarioLVS usr) {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		List<VisitaLVS> detached = null;
		Query query=null;
		
		try {
			Map<String, Object> pars = new HashMap<String, Object>();
			String queryStr = "fecha >= :fechaini && fecha <= :fechater && usuario == :usr";
			pars.put("fechaini", fecha_ini);
			pars.put("fechater", fecha_ter);
			pars.put("usr", usr);

			query = pm.newQuery(VisitaLVS.class);
			query.setFilter(queryStr);
			query.setOrdering("usuario ASC");
			query.setOrdering("fecha DESC");// DESC
			query.setOrdering("negocio ASC");// DESC
			query.setOrdering("sitio ASC");// DESC
			query.setOrdering("area ASC");// DESC

			detached = (List<VisitaLVS>) pm.detachCopyAll((List<VisitaLVS>) query.executeWithMap(pars));			
		} catch (Exception e) {
			log.error("DAO " + e.getMessage());
		} finally {
			pm.close();
		}
		return detached;

	}	

	public static void insertar(UsuarioLVS usuario, VisitaLVS visita) {
		Transaction tx = null;
		PersistenceManager pm = PMF.get().getPersistenceManager();
		try {
			tx = pm.currentTransaction();
			tx.begin();
			pm.makePersistent(usuario);
			pm.makePersistent(visita);
			tx.commit();
		} catch (Exception e) {
			log.error("insertar " + e.getMessage());
		} finally {
			if (tx.isActive()) {
				tx.rollback();
			}
			if (!pm.isClosed()) {
				pm.close();
			}
		}
	}

	public static void actualizar(Long idUsuario, Long idVisita, Date fecha,
			int personas, Date horaInico, Date horaTermino, Long responsable,
			Long negocio, Long sitio, Long area, String comentario,
			Hashtable<Long, Seguridad> ht, Long tseguro, Long tinseguro,
			Long tmeta, Long duracion, String nombreUsuario,
			String nombreNegocio, String nombreSitio, String nombreArea) {
		Transaction tx = null;
		PersistenceManager pm = PMF.get().getPersistenceManager();
		VisitaLVS _visita = null;
		try {
			Key k1 = KeyFactory.createKey(UsuarioLVS.class.getSimpleName(),
					idUsuario);
			Key k2 = KeyFactory.createKey(k1, VisitaLVS.class.getSimpleName(),
					idVisita);
			_visita = pm.getObjectById(VisitaLVS.class, k2);
			tx = pm.currentTransaction();
			tx.begin();

			_visita.setFecha(fecha);
			_visita.setPersonas(personas);
			_visita.setHoraInico(horaInico);
			_visita.setHoraTermino(horaTermino);
			_visita.setResponsable(responsable);
			_visita.setNegocio(negocio);
			_visita.setSitio(sitio);
			_visita.setArea(area);
			_visita.setComentario(comentario);
			_visita.setTseguro(tseguro);
			_visita.setTinseguro(tinseguro);
			_visita.setTmeta(tmeta);
			_visita.setDuracion(duracion);
			_visita.setNombreUsuario(nombreUsuario);
			_visita.setNombreNegocio(nombreNegocio);
			_visita.setNombreSitio(nombreSitio);
			_visita.setNombreArea(nombreArea);

			List<VisitaItemLVS> lstVisitaItem = _visita.getVisitaitems();
			Iterator<VisitaItemLVS> iter = lstVisitaItem.iterator();
			while (iter.hasNext()) {
				VisitaItemLVS it = (VisitaItemLVS) iter.next();
				if (ht.containsKey(it.getItem())) {
					it.setInseguro(((Seguridad) ht.get(it.getItem()))
							.isInseguro());
					it.setSeguro(((Seguridad) ht.get(it.getItem())).isSeguro());
					it.setFecha(fecha);
					it.setNegocio(negocio);
					it.setSitio(sitio);
					it.setArea(area);
					it.setNombreNegocio(nombreNegocio);
					it.setNombreSitio(nombreSitio);
					it.setNombreArea(nombreArea);
					it.setTseguro(tseguro);
					it.setTinseguro(tinseguro);
					it.setTeval(tseguro.longValue()+tinseguro.longValue());
				}
			}
			tx.commit();
		} catch (Exception e) {
			log.error(e.getMessage());
		} finally {
			if (tx.isActive()) {
				tx.rollback();
			}
			if (!pm.isClosed()) {
				pm.close();
			}
		}

	}

	public static VisitaLVS getVisitaLVSbyId(Long idUsuario, Long idVisita) {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		VisitaLVS visita, detached = null;
		try {
			Key k1 = KeyFactory.createKey(UsuarioLVS.class.getSimpleName(),
					idUsuario);
			Key k2 = KeyFactory.createKey(k1, VisitaLVS.class.getSimpleName(),
					idVisita);
			visita = pm.getObjectById(VisitaLVS.class, k2);
			detached = pm.detachCopy(visita);
		} catch (Exception e) {
			log.error(e.getMessage());
		} finally {
			pm.close();
		}
		return detached;
	}

	public static List<VisitaItemLVS> obtenerItemSVL(Long idUsuario,
			Long idVisita) {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		VisitaLVS visita = null;
		List<VisitaItemLVS> detached = null;
		try {
			Key k1 = KeyFactory.createKey(UsuarioLVS.class.getSimpleName(),
					idUsuario);
			Key k2 = KeyFactory.createKey(k1, VisitaLVS.class.getSimpleName(),
					idVisita);
			visita = pm.getObjectById(VisitaLVS.class, k2);
			detached = (List<VisitaItemLVS>) pm.detachCopyAll(visita
					.getVisitaitems());
		} catch (Exception e) {
			log.error(e.getMessage());
		} finally {
			pm.close();
		}
		return detached;
	}

	public static void borrar(Long idUsuario, Long idVisita) {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		try {
			Key k1 = KeyFactory.createKey(UsuarioLVS.class.getSimpleName(),
					idUsuario);
			Key k2 = KeyFactory.createKey(k1, VisitaLVS.class.getSimpleName(),
					idVisita);
			pm.deletePersistent(pm.getObjectById(VisitaLVS.class, k2));
		} catch (Exception e) {
			log.error(e.getMessage());
		} finally {
			pm.close();
		}
	}


	@SuppressWarnings("unchecked")
	public static List<VisitaLVS> visitasPorUsuario(UsuarioLVS usr,Date fecha_ini,Date fecha_ter,Long negocio,Long sitio,Long area) {

		PersistenceManager pm = PMF.get().getPersistenceManager();
		List<VisitaLVS> detached = null;
		Query query = null;
		try {

			Map<String, Object> pars = new HashMap<String, Object>();
			String queryStr = "fecha >= :fechaini && fecha <= :fechater && usuario == :usr";
			
			if(negocio.longValue()!=0){
				queryStr+=" && negocio == :neg";
				pars.put("neg", negocio.longValue());
			}
			
			if(sitio.longValue()!=0){
				queryStr+=" && sitio == :sit";
				pars.put("sit", sitio.longValue());
			}
			
			if(area.longValue()!=0){
				queryStr+=" && area == :are";
				pars.put("are", area.longValue());
			}			
			
			pars.put("fechaini", fecha_ini);
			pars.put("fechater", fecha_ter);
			pars.put("usr", usr);
			query = pm.newQuery(VisitaLVS.class);
			query.setFilter(queryStr);

			detached = (List<VisitaLVS>) pm
					.detachCopyAll((List<VisitaLVS>) query.executeWithMap(pars));
		} catch (Exception e) {
			log.error(e.getMessage());
		} finally {
			pm.close();
		}
		return detached;
	}
	
	@SuppressWarnings("unchecked")
	public static List<VisitaLVS> visitasPorUsuario(UsuarioLVS usr,Date fecha_ini,Date fecha_ter) {

		PersistenceManager pm = PMF.get().getPersistenceManager();
		List<VisitaLVS> detached = null;
		Query query = null;
		try {

			Map<String, Object> pars = new HashMap<String, Object>();
			String queryStr = "fecha >= :fechaini && fecha <= :fechater && usuario == :usr";
			
			pars.put("fechaini", fecha_ini);
			pars.put("fechater", fecha_ter);
			pars.put("usr", usr);
			query = pm.newQuery(VisitaLVS.class);
			query.setFilter(queryStr);

			detached = (List<VisitaLVS>) pm
					.detachCopyAll((List<VisitaLVS>) query.executeWithMap(pars));
		} catch (Exception e) {
			log.error(e.getMessage());
		} finally {
			pm.close();
		}
		return detached;
	}	
	
	public static void borrarVisitasPorGerencia(Long idGerencia) {

		try {

				Util.deleteAllEntities("VisitaLVS","idGerencia",idGerencia);

			
		} catch (Exception e) {
			log.error(e.getMessage());
		} 

	}	

}
